題目描述:
給定一個由整陣列成的非空陣列,表示一個非負整數,在該數的基礎上加一,並返回結果陣列。
最高位數字存放在陣列的首位,陣列中每個元素只存儲單個數字。
你可以假設除了整數 0 之外,這個整數不會以零開頭。
Example 1:
digits = [1,2,3]
[1,2,4]
123
。加一後得到 123 + 1 = 124
,因此結果應為 [1,2,4]
。解題思路:
這道 LeetCode 題目是實作題,只要按照題目要求進行操作即可。唯一需要注意的是,由於最高位數字存放在陣列組的開頭,所以我們必須從陣列的末尾開始處理加法。
當我們從陣列的最後一位開始加 1 時,如果結果是 10,表示需要進位。這時候,我們將當前位設為 0,並繼續處理前一位。如果遍歷完所有位數後還需要進位,就在陣列的最前面加一個 1。這樣就能確保陣列正確地表示加 1 後的結果。這個過程的關鍵在於理解進位的處理方式,以及如何從陣列末尾開始遍歷來解決問題。
在 JavaScript 中,如果要對陣列的尾端增減元素,會使用 push
和 pop
方法;如果要對陣列的頭端增減元素,則會使用 unshift
和 shift
方法。在這道題中,當遍歷完所有位數後仍需要進位時,我們可以使用 unshift
方法在陣列的最前面新增一個 1
。這樣可以輕鬆地解決進位問題。
var plusOne = function(digits) {
for (let i = digits.length - 1; i >= 0; i--) {
digits[i]++;
if (digits[i] === 10) {
digits[i] = 0;
} else {
return digits;
}
}
digits.unshift(1);
return digits;
};
時間複雜度:
O(n)
,其中n
是陣列的長度。我們最多遍歷陣列中的每一位一次。
空間複雜度:O(1)
,除了輸入和輸出,我們只使用了常數級別的額外空間。
總結:
LeetCode 的 Easy 題目中有不少是實作題,不需要複雜的演算法介入,只需按照要求實作即可解題。由於數字的排列方式與 Array 的排列方式剛好相反,因此在遍歷時需要從尾部開始,這點對於入門者來說尤其需要注意。這道題目可以歸類為「for 迴圈」,是一道相對平易近人的題目。